#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <assert.h>
#include <ctype.h>


#define trimSpace(start) do{\  // 这里的一个 \ 表示续航操作 
                                while(isspace(*start)) start++;\
                            }
                        while(0)

#define NUM 1024
#define OPT_NUM 64
#define NONE_REDIR 0
// 输入重定向
#define INPUT_REDIR 1
// 输出重定向
#define OUTPUT_REDIR 2
// 错误重定向
#define ERROR_REDIR 3 

char lineCommand[NUM];
char *myargv[OPT_NUM];
int redirType = NONE_REDIR; // 默认没有重定向
char *redirFile = NULL; // 重定向文件的名称

// echo 命令
void commandCheck(char* commands)
{
    assert(commands);
    char *start = commands;
    char *end = commands + strlen(commands);
    while(start < end)
    {
        if(*start == '>')
        {

        }
        else if (*start == '<')
        {
            // 例： cat < filetxt   // 以\0 为界 左边部分是命令 右边部分是文件
            *start = '\0';
            start++;
            trimSpace(start);
            // 填写重定向信息
            redirType = INPUT_REDIR;
            redirFile = start;
        }
        else
        {
            start++;
        }
    }
}

int main()
{
    while(1)
    {

        // 输出提示符
        printf("用户名@主机名 当前路径# ");
        fflush(stdout);
    
        // 获取用户输入
        char *s = fgets(lineCommand,sizeof(lineCommand)-1,stdin);
        assert(s != NULL);
        // 清除最后一个\n 
        lineCommand[strlen(lineCommand)-1] = 0;

        // printf("test: %s\n",lineCommand);
        
        // 做echo命令 需要使用重定向
        commandCheck(lineCommand);
        
        //"ls -a -l -i" ---> "ls" "-a" "-l" "-i"
        //需要把字符做切割
        myargv[0] = strtok(lineCommand," ");
        int i = 1;
        while(myargv[i++] = strtok(NULL," "));
#ifdef DEBUG
    // 测试 字符串切割是否成功
    for(i = 0; myargv[i]; i++)
    {
        printf("%s\n",myargv[i]);
    }
#endif
    
        // 执行命令
    
        // 创建子进程 用子进程执行
        pid_t id = fork();
        assert(id != -1);

        if(id == 0)
        {
            //子进程
            // 进程替换
            execvp(myargv[0],myargv);
            exit(1);
        }

        // 进程等待 释放子进程
        waitpid(id,NULL,0);
    
    }
}
